/* * ****************************************************************************** * Copyright (c) 2013 JavaTIC. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Yann Le Moigne - initial API and implementation * ***************************************************************************** */ package fr.javatic.vertx.webjar.puller; import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.List; import org.apache.maven.repository.internal.MavenRepositorySystemUtils; import org.eclipse.aether.DefaultRepositorySystemSession; import org.eclipse.aether.RepositorySystem; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.DefaultArtifact; import org.eclipse.aether.collection.CollectRequest; import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyFilter; import org.eclipse.aether.impl.DefaultServiceLocator; import org.eclipse.aether.repository.LocalRepository; import org.eclipse.aether.resolution.ArtifactResult; import org.eclipse.aether.resolution.DependencyRequest; import org.eclipse.aether.resolution.DependencyResolutionException; import org.eclipse.aether.spi.connector.RepositoryConnectorFactory; import org.eclipse.aether.spi.connector.transport.TransporterFactory; import org.eclipse.aether.transport.file.FileTransporterFactory; import org.eclipse.aether.transport.http.HttpTransporterFactory; import org.eclipse.aether.util.artifact.JavaScopes; import org.eclipse.aether.util.filter.DependencyFilterUtils; import org.vertx.java.core.file.FileSystem; import org.vertx.java.core.json.JsonArray; import org.vertx.java.core.json.JsonObject; import org.vertx.java.platform.Verticle; import fr.javatic.vertx.webjar.WebjarModuleConfig; import fr.javatic.vertx.webjar.WebjarModuleException; public class WebjarPullerVerticle extends Verticle { private FileSystem fileSystem; private JsonObject config; @Override public void start() { config = container.config(); fileSystem = vertx.fileSystem(); final String webjarsDirPath = config.getString(WebjarModuleConfig.WEBJARS_DIR_PATH, WebjarModuleConfig.WEBJARS_DIR_PATH_DEFAULT); final JsonArray webjars = config.getArray(WebjarModuleConfig.WEBJARS, WebjarModuleConfig.WEBJARS_DEFAULT); fileSystem.mkdirSync(webjarsDirPath, true); List<Dependency> dependencies = getDependencies(webjars); Collection<File> artifacts = getArtifactsFiles(dependencies); for (File artifact : artifacts) { String artifactPath = artifact.getAbsolutePath(); String webjarPath = webjarsDirPath + "/" + artifact.getName(); if (fileSystem.existsSync(webjarPath)) { fileSystem.deleteSync(webjarPath); } fileSystem.copySync(artifactPath, webjarPath); } } private Collection<File> getArtifactsFiles(List<Dependency> dependencies) { String reposFileName = config.getString(WebjarModuleConfig.REPOS_FILE, WebjarModuleConfig.REPOS_FILE_DEFAULT); RepositoryConfig repositoryConfig = new RepositoryConfig(container.logger(), reposFileName); RepositorySystem system = createRepositorySystem(); RepositorySystemSession session = createRepositorySystemSession(system, repositoryConfig.getLocalRepository()); DependencyFilter classpathFilter = DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE); CollectRequest collectRequest = new CollectRequest(dependencies, null, repositoryConfig.getRemoteRepositories()); DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, classpathFilter); try { List<ArtifactResult> artifactResults = system.resolveDependencies(session, dependencyRequest) .getArtifactResults(); Collection<File> artifactsFiles = new HashSet<>(); for (ArtifactResult artifactResult : artifactResults) { checkArtifactResultStatus(artifactResult); artifactsFiles.add(artifactResult.getArtifact().getFile()); } return artifactsFiles; } catch (DependencyResolutionException e) { throw new WebjarModuleException("Failed to resolve dependencies", e); } } private void checkArtifactResultStatus(ArtifactResult artifactResult) { if (!artifactResult.isResolved()) { throw new WebjarModuleException(String.format("Failed to get artifact (Result: %s)", artifactResult.toString())); } } private List<Dependency> getDependencies(JsonArray webjars) { List<Dependency> dependencies = new ArrayList<>(); for (int i = 0; i < webjars.size(); i++) { String artifactGav = webjars.get(i); Artifact artifact = new DefaultArtifact(artifactGav); Dependency dependency = new Dependency(artifact, JavaScopes.COMPILE); dependencies.add(dependency); } return dependencies; } private RepositorySystem createRepositorySystem() { DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator(); locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class); locator.addService(TransporterFactory.class, FileTransporterFactory.class); locator.addService(TransporterFactory.class, HttpTransporterFactory.class); return locator.getService(RepositorySystem.class); } private RepositorySystemSession createRepositorySystemSession(RepositorySystem system, LocalRepository localRepository) { DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession(); session.setLocalRepositoryManager(system.newLocalRepositoryManager(session, localRepository)); session.setTransferListener(new ConsoleTransferListener()); session.setRepositoryListener(new ConsoleRepositoryListener()); session.setReadOnly(); return session; } }